#include <string.h>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;

//构造函数的使用
void test(){
    string s1;

    //利用c风格的字符串创建一个string对象
    string s2("hello");

    string s3("hello,python", 5);

    cout << s1 << s2 << s3 << endl;
    string s4 = s2;
    string s5(s2);
    cout << s4 << s5 << endl;
    string s6(s2, 1, 4);
    cout << s6 << endl;
    string s7(8, 'h');
    cout << s7 << endl;

    //通过提供一个首迭代器、末尾迭代器构造一个string对象
    //迭代器目前阶段你就可以理解为是一个宽泛意义上的指针
    string s8(s2.begin(), s2.end() - 1);
    cout << s8 << endl;
    //关于迭代器，除了可以使用string的begin和end方法来获取迭代器
    //还可以使用数组
    char arr[6] = "world";
    string s9(arr, arr + 5);
    cout << s9 << endl;
}
//字符串的拼接操作，之前是如何操作的？
void test2(){
    //c风格字符串如何进行处理
    char str1[6] = "hello";
    char str2[6] = "world";
    //int legnth = strlen(str1) + strlen(str2) + 1;
    char str3[11];
    strcpy(str3, str1);
    strcat(str3, str2);
    cout << str3 << endl;
    //string如何进行拼接处理呢？？？
    string s1("hello");
    string s2("world");
    string s3 = s1 + s2;
    cout << s3 << endl;
}

void test3(){
    string s1("hello");
    //下面这两个函数返回的是c风格的字符串
    //这样的话便可以将string和c风格字符串打通
    const char * pstr1 = s1.c_str();
    const char * pstr2 = s1.data();
    cout << pstr1 << endl;
    cout << pstr2 << endl;

    cout << s1.empty() << endl;
    cout << s1.length() << endl;
    cout << s1.size() << endl;
    //在末尾追加单个字符
    s1.push_back('c');
    s1.push_back('+');
    s1.push_back('+');
    cout << s1 << endl;
    s1.append(5,'w');//在末尾添加5个w
    cout << s1 << endl;

    string s2("helo,c++");
    s1.append(s2);//在s1的后面直接追加一个s2
    cout << s1 << endl;
    //除了使用上述方式之外，还有一种方式
    s1 += s2;//这种方式也是可以的
    cout << s1 << endl;
    s1.append("hello");
    cout << s1 << endl;
}

void test4(){
    string s1("hello,world");
    cout << s1.find("wor",0) << endl;
}

void test5(){
    //==符号比较的是字符串的内容，并没有去比较地址是否一致
    string s1("hello");
    string s2("world");
    string s3("hello");
    cout << (s1 == s2) << endl;
    cout << (s1 == s3) << endl;
}

void test6(){
    //这个是什么形式呢？
    //这个其实借助的是构造函数来完成的
    string s1 = "hello";
    string s2("hello");
}

//string的遍历-------需要重点关注
//一共有3种方式
//方式1：string有一个size()统计长度
//还有一个下标访问运算符，二者组合在一起可以遍历全部的字符
//可以像数组一样通过下标去访问
//str[0]
void test7(){
    string s1 = "hello";
    for(size_t i = 0; i < s1.size(); ++i){
        cout << s1[i];
        cout << s1.at(i);
        cout << endl;
    }
}
//增强for循环
void test8(){
    string s1 = "hello";
    //增强for循环的语法
    //每迭代出来一个元素，那么便会赋值给当前的变量
    //此时便会伴随着一次拷贝操作
    //如果不希望拷贝，则直接使用引用来接收即可
    //for(遍历出来的每个元素的类型 遍历出来每个变量 : 需要迭代的数据){}
    //
    for(char & c: s1){
        cout << c << endl;
    }
}

void test9(){
    //使用迭代器的方式来遍历
    //在目前阶段，你就完全可以把迭代器当做指针来去使用
    //begin函数获取的是指向首元素位置的迭代器
    //end函数获取的是指向末尾后元素位置的迭代器
    //进行加法运算
    string s1 = "hello";
    //对于iterator的写法有些复杂，尤其是后续学习了set、map之后
    //迭代器的写法更加复杂，所以c++11之后引入了一个新的数据类型auto
    //编译器可以自动推断出该变量的类型究竟是什么
    //string::iterator it = s1.begin();
    auto it = s1.begin();
    while(it != s1.end()){
        cout << *it << endl;
        ++it;
    }
}

int main()
{
    test9();
    return 0;
}

